package com.member.shop.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.member.common.enums.DeleteEnum;
import com.member.common.enums.EnableStatusEnum;
import com.member.common.utils.DateUtils;

import javax.annotation.Resource;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.member.common.utils.StringUtils;
import com.member.shop.domain.SysBizTenantArea;
import com.member.shop.domain.SysBizUserAddress;
import com.member.shop.mapper.SysBizTenantAreaMapper;
import com.member.shop.vo.AreasVo;
import com.member.shop.vo.CityVo;
import org.springframework.stereotype.Service;
import com.member.shop.mapper.SysBizTenantMapper;
import com.member.shop.domain.SysBizTenant;
import com.member.shop.service.ISysBizTenantService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

/**
 * 站点信息Service业务层处理
 *
 * @author lixinchen
 * @date 2025-01-08
 */
@Service
public class SysBizTenantServiceImpl extends ServiceImpl<SysBizTenantMapper, SysBizTenant> implements ISysBizTenantService {
    @Resource
    private SysBizTenantMapper sysBizTenantMapper;


    @Resource
    private SysBizTenantAreaMapper sysBizTenantAreaMapper;
    /**
     * 查询站点信息
     *
     * @param id 站点信息主键
     * @return 站点信息
     */
    @Override
    public SysBizTenant selectSysBizTenantById(Long id) {
        return sysBizTenantMapper.selectById(id);
    }

    @Override
    public SysBizTenant selectSysBizTenantByDefault() {
        List<SysBizTenant> list = sysBizTenantMapper.selectSysBizTenantByDefault();
        if (CollectionUtils.isEmpty(list)) {
            return null;
        }
        return list.get(0);
    }

    /**
     * 查询站点信息列表
     *
     * @param queryWrapper 站点信息
     * @return 站点信息
     */
    @Override
    public List<SysBizTenant> selectSysBizTenantList(LambdaQueryWrapper<SysBizTenant> queryWrapper) {
        return sysBizTenantMapper.selectList(queryWrapper);
    }

    @Override
    public List<SysBizTenant> selectSysBizTenantList(SysBizTenant sysBizTenant) {
        return this.baseMapper.selectSysBizTenantList(sysBizTenant);
    }

    /**
     * 新增站点信息
     *
     * @param sysBizTenant 站点信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int insertSysBizTenant(SysBizTenant sysBizTenant) {
        if (sysBizTenant.getGrounding() == 0 && sysBizTenant.getIsDefault() == 1) {
            sysBizTenantMapper.update(sysBizTenant.builder().isDefault(0L).build(), new LambdaUpdateWrapper<SysBizTenant>()
                    .eq(SysBizTenant::getIsDefault, 1L));
        }
        sysBizTenant.setCreateTime(DateUtils.getNowDate());
        int insert = sysBizTenantMapper.insert(sysBizTenant);
        handleCityAreas(sysBizTenant);
        return insert;
    }

    /**
     * 修改站点信息
     *
     * @param sysBizTenant 站点信息
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateSysBizTenant(SysBizTenant sysBizTenant) {
        if (sysBizTenant.getGrounding() == 0 && sysBizTenant.getIsDefault() == 1) {
            sysBizTenantMapper.update(sysBizTenant.builder().isDefault(0L).build(), new LambdaUpdateWrapper<SysBizTenant>()
                    .eq(SysBizTenant::getIsDefault, 1L));
        }
        sysBizTenant.setUpdateTime(DateUtils.getNowDate());
        handleCityAreas(sysBizTenant);
        return sysBizTenantMapper.updateById(sysBizTenant);
    }


    private void handleCityAreas(SysBizTenant sysBizTenant) {
        String cityAreaJson = sysBizTenant.getCityAreaJson();
        if (StringUtils.isEmpty(cityAreaJson)) {
            return;
        }
        List<CityVo> cityVos = JSON.parseArray(cityAreaJson, CityVo.class);
        if (CollectionUtils.isEmpty(cityVos)) {
            return;
        }
        // 提前获取一些不变的值
        Long tenantIdA = sysBizTenant.getId();
        String province = sysBizTenant.getProvince();
        Integer notDeleteKey = DeleteEnum.NOT_DELETE.getKey();
        Long orderNum = 1L;

        List<SysBizTenantArea> sysBizTenantAreas = new ArrayList<>();
        for (CityVo cityVo : cityVos) {
            String cityName = cityVo.getCityName(); // 减少方法调用次数
            for (AreasVo areasVo : cityVo.getAreas()) {
                SysBizTenantArea sysBizTenantArea = new SysBizTenantArea();
                sysBizTenantArea.setTenantId(tenantIdA);
                sysBizTenantArea.setProvince(province);
                sysBizTenantArea.setCity(cityName);
                sysBizTenantArea.setArea(areasVo.getAreaName());
                sysBizTenantArea.setDeleted(notDeleteKey);
                sysBizTenantArea.setOrderNum(orderNum);
                sysBizTenantAreas.add(sysBizTenantArea);
            }
        }

        // 清除旧数据并插入新数据
        sysBizTenantAreaMapper.delete(new LambdaQueryWrapper<SysBizTenantArea>()
                .eq(SysBizTenantArea::getTenantId, tenantIdA));

        if (!sysBizTenantAreas.isEmpty()) { // 确保只有在有数据时才执行插入操作
            sysBizTenantAreaMapper.insertBatch(sysBizTenantAreas);
        }
    }

    /**
     * 批量删除站点信息
     *
     * @param ids 需要删除的站点信息主键
     * @return 结果
     */
    @Override
    public int deleteSysBizTenantByIds(Long[] ids) {
        return sysBizTenantMapper.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 删除站点信息信息
     *
     * @param id 站点信息主键
     * @return 结果
     */
    @Override
    public int deleteSysBizTenantById(Long id) {
        return sysBizTenantMapper.deleteById(id);
    }
}
